home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tools / jade / man / jade.info-9 (.txt) < prev    next >
GNU Info File  |  1995-03-09  |  50KB  |  961 lines

  1. This is Info file jade.info, produced by Makeinfo-1.55 from the input
  2. file jade.texi.
  3. START-INFO-DIR-ENTRY
  4. * Jade: (jade).            An editor for X11 and AmigaDOS
  5. END-INFO-DIR-ENTRY
  6.    This is Edition 1.3, last updated 7 October 1994, of `The Jade
  7. Manual', for Jade, Version 3.2.
  8.    Jade is a text editor for X11 (on Unix) and the Amiga.
  9.    Copyright 1993, 1994 John Harper.
  10.    Permission is granted to make and distribute verbatim copies of this
  11. manual provided the copyright notice and this permission notice are
  12. preserved on all copies.
  13.    Permission is granted to copy and distribute modified versions of
  14. this manual under the conditions for verbatim copying, provided that
  15. the entire resulting derived work is distributed under the terms of a
  16. permission notice identical to this one.
  17. File: jade.info,  Node: Indentation Functions,  Next: Translation Functions,  Prev: Transpose Functions,  Up: Text
  18. Indentation Functions
  19. ---------------------
  20.  - Function: indent-pos &optional POS BUFFER
  21.      This function returns the *glyph* position (*note Glyph
  22.      Positions::.) of the first character in the line pointed to by POS
  23.      (or the cursor) which is not a TAB or SPC character.
  24.  - Function: set-indent-pos INDENT-POS &optional BUFFER ONLY-SPACES
  25.      Sets the indentation of the line pointed to by POS to the column
  26.      pointed to by POS by putting the optimal sequence of TAB and SPC
  27.      characters at the start of the line.
  28.      If the ONLY-SPACES argument is non-`nil' no TAB characters will be
  29.      used.
  30.  - Command: indent-to COLUMN &optional ONLY-SPACES
  31.      This function inserts enough TAB and SPC characters to move the
  32.      cursor to glyph column COLUMN.
  33.      If the ONLY-SPACES argument is non-`nil' no TAB characters are
  34.      used.
  35.      Note that COLUMN counts from zero.
  36.      When called interactively the COLUMN argument is either the
  37.      numeric value of the prefix argument or, if no prefix argument has
  38.      been entered, the result of prompting for a number.
  39.  - Command: tab-with-spaces
  40.      This command inserts enough spaces at the cursor position to move
  41.      the cursor to the next tab stop.
  42.    Some major modes provide their own method of indentation (for example
  43. Lisp mode will indent Lisp programs in the proper style), see *Note
  44. Mode-Specific Indentation::.
  45.  - Command: indent-line
  46.      If the current buffer has a method for indentation installed, use
  47.      it to indent the current line to its correct depth.
  48.  - Command: newline-and-indent
  49.      Insert a newline character, then indent the new line; if no
  50.      function for indenting lines has been installed in this buffer a
  51.      single TAB character is inserted.
  52.  - Command: indent-area START-POS END-POS
  53.      Uses the buffer's indentation method to indent all lines in the
  54.      specified region to their correct depth.
  55.      When called interactively the currently-marked block is used to
  56.      get the values of the two arguments, the block is then unmarked.
  57. File: jade.info,  Node: Translation Functions,  Next: Search and Match Functions,  Prev: Indentation Functions,  Up: Text
  58. Translation Functions
  59. ---------------------
  60.  - Function: translate-area START-POS END-POS TRANSLATION-TABLE
  61.           &optional BUFFER
  62.      This function applies the mapping TRANSLATION-TABLE to each
  63.      character in the region starting at the position START-POS up to,
  64.      but not including, END-POS.
  65.      TRANSLATION-TABLE is a string, each character represents the
  66.      mapping for an ASCII character of that character's position in the
  67.      string. If the string is less than 256 characters in length any
  68.      undefined characters will remain unchanged (i.e. a
  69.      TRANSLATION-TABLE of `' would leave the region unaltered).
  70.  - Function: translate-string STRING TRANSLATION-TABLE
  71.      This function uses a similar method to that used in the
  72.      `translate-area' function. Instead of applying the mapping to a
  73.      region of a buffer it applies it to the string STRING. STRING is
  74.      returned (after being modified).
  75.      Note that the STRING really is modified, no copy is made!
  76.           (translate-string "abc" upcase-table)
  77.               => "ABC"
  78.  - Variable: upcase-table
  79.      This is a 256-character long string which may be used as a
  80.      translation table to convert from lower-case to upper-case with
  81.      the functions `translate-string' and `translate-area'.
  82.  - Variable: downcase-table
  83.      Similar to `upcase-table' except that it is used to convert from
  84.      upper-case to lower-case.
  85.    The following functions use the translation functions and the two
  86. translation tables described above.
  87.  - Command: upcase-area START-POS END-POS &optional BUFFER
  88.      Makes all alphabetic characters in the specified region of text
  89.      upper-case.
  90.      When called interactively uses the block marks for its arguments;
  91.      note that this won't work properly with rectangular blocks.
  92.  - Command: downcase-area START-POS END-POS &optional BUFFER
  93.      Similar to `upcase-area' but makes all alphabetic characters
  94.      lower-case.
  95.  - Command: upcase-word COUNT
  96.      For the next COUNT words starting at the cursor position, make
  97.      their alphabetic characters upper-case.
  98.  - Command: downcase-word COUNT
  99.      Does the opposite of `upcase-word', makes words lower-case!
  100.  - Command: capitalize-word
  101.      The first character of this word (normally the one under the
  102.      cursor) is made upper-case, the rest lower.
  103. File: jade.info,  Node: Search and Match Functions,  Next: Rectangular Editing,  Prev: Translation Functions,  Up: Text
  104. Searching and Matching Functions
  105. --------------------------------
  106.    The most powerful of the searching and matching functions are those
  107. using regular expressions, for details of the regexp syntax used by
  108. Jade see *Note Regular Expressions::.
  109.    Note that the regexp matcher *does not work across lines*, at the
  110. moment no regexp may span more than one line. Also the regexp routines
  111. choke on NUL bytes; hopefully I'll correct these problems soon...
  112. * Menu:
  113. * Searching Buffers::           Scanning buffers for something
  114. * String Matching::             Matching regexps to text
  115. * Replacing Strings::           Replacing a found string or regexp with
  116.                                   something else
  117. * Regexp Functions::            General regexp utility functions
  118. File: jade.info,  Node: Searching Buffers,  Next: String Matching,  Up: Search and Match Functions
  119. Searching Buffers
  120. .................
  121.  - Function: find-next-regexp REGEXP &optional POS BUFFER IGNORE-CASE
  122.      This function returns the position of the next substring in the
  123.      buffer matching the regular expression string REGEXP. It starts
  124.      searching at POS, or the cursor position if POS is undefined.
  125.      If no match of the regexp occurs before the end of the buffer `nil'
  126.      is returned.
  127.      If the IGNORE-CASE argument is non-`nil' then the case of matched
  128.      strings is ignored (note that character ranges are still
  129.      case-significant).
  130.  - Function: find-prev-regexp REGEXP &optional POS BUFFER IGNORE-CASE
  131.      Similar to `find-next-regexp' except this searches in the opposite
  132.      direction, from POS (or the cursor) to the *start* of the buffer.
  133.  - Function: find-next-string STRING &optional POS BUFFER
  134.      Scans forwards from POS (or the cursor), in BUFFER (or the current
  135.      buffer), looking for a match with the string STRING. Returns the
  136.      position of the next match or `nil'.
  137.      Note that matches can't span more than one line.
  138.  - Function: find-prev-string STRING &optional POS BUFFER
  139.      A backwards-searching version of `find-next-string'.
  140.  - Function: find-next-char CHARACTER &optional POS BUFFER
  141.      Search forwards for an occurrence of the character CHARACTER and
  142.      returns its position, or `nil' if no occurrence exists.
  143.  - Function: find-prev-char CHARACTER &optional POS BUFFER
  144.      This function searches backwards for an occurrence of the character
  145.      CHARACTER.
  146. File: jade.info,  Node: String Matching,  Next: Replacing Strings,  Prev: Searching Buffers,  Up: Search and Match Functions
  147. String Matching
  148. ...............
  149.  - Function: looking-at REGEXP &optional POS BUFFER IGNORE-CASE
  150.      Returns `t' if the regular expression REGEXP matches the text at
  151.      position POS in the buffer BUFFER (or the current buffer).
  152.      Only the text from POS to the end of the line is matched against.
  153.  - Function: regexp-match REGEXP STRING &optional IGNORE-CASE
  154.      This function returns `t' if the regular expression REGEXP matches
  155.      the string STRING.
  156.      Note that the match is unanchored so if you want test for a match
  157.      of the whole of STRING use the `^' and `$' regexp meta-characters.
  158.      For example,
  159.           (regexp-match "(a|b)+" "fooabababar")
  160.               => t
  161.           
  162.           (regexp-match "^(a|b)+$" "fooabababar")
  163.               => nil
  164.           
  165.           (regexp-match "^(a|b)+$" "ababbabba")
  166.               => t
  167.      When the IGNORE-CASE argument is non-`nil' the case of strings
  168.      being matched is insignificant (except in character ranges).
  169.  - Function: regexp-expand REGEXP STRING TEMPLATE &optional IGNORE-CASE
  170.      This function matches the regular expression REGEXP against the
  171.      string STRING, if the match is successful a string is created by
  172.      expanding the template string TEMPLATE.
  173.      For details of what meta-characters are allowed in TEMPLATE see
  174.      *Note Regular Expressions::.
  175.           (regexp-expand "^([a-z]+):([0-9]+)$"
  176.                          "foobar:42"
  177.                          "The \\1 is \\2.")
  178.               => "The foobar is 42."
  179.  - Function: regexp-match-line REGEXP &optional LINE-POS BUFFER
  180.           IGNORE-CASE
  181.      This function is similar to `regexp-match', instead of explicitly
  182.      supplying the string to match against it is one whole line of the
  183.      specified buffer, the line pointed to by LINE-POS (or the line
  184.      that the cursor is on).
  185.      `t' is returned if the match is successful.
  186.  - Function: regexp-expand-line REGEXP TEMPLATE &optional LINE-POS
  187.           BUFFER IGNORE-CASE
  188.      As `regexp-match-line' is similar to `regexp-match', this function
  189.      is similar to `regexp-expand'.
  190.      The whole of the line at the position LINE-POS (or the cursor) is
  191.      matched with the regular expression REGEXP. If the match is
  192.      successful the TEMPLATE is used to expand a string which is
  193.      returned.
  194. File: jade.info,  Node: Replacing Strings,  Next: Regexp Functions,  Prev: String Matching,  Up: Search and Match Functions
  195. Replacing Strings
  196. .................
  197.  - Function: replace-regexp REGEXP TEMPLATE &optional POS BUFFER
  198.           IGNORE-CASE
  199.      If a substring of the buffer at POS (or the cursor) matches the
  200.      regular expression REGEXP the text that matched is replaced with
  201.      the result of expanding the template string TEMPLATE.
  202.      For details about templates see *Note Regular Expressions::.
  203.      `nil' is returned if the match failed, and therefore no replacement
  204.      occurred.
  205.  - Function: replace-string OLD-STRING NEW-STRING &optional POS BUFFER
  206.      If a substring of the buffer at POS (or the cursor) matches the
  207.      string OLD-STRING it is replaced by the string NEW-STRING.
  208.      If the match fails `nil' is returned, otherwise some non-`nil'
  209.      value.
  210. File: jade.info,  Node: Regexp Functions,  Prev: Replacing Strings,  Up: Search and Match Functions
  211. Regexp Functions
  212. ................
  213.    It is often useful to construct regular expressions by concatenating
  214. several strings together; the problem with doing this is you may not
  215. know if a string contains any characters which the regexp compiler
  216. reacts specially to (i.e. `*', `|', ...). Obviously these characters
  217. should be protected by a backslash, the following function will do this
  218. for you.
  219.  - Function: regexp-quote STRING
  220.      This function returns a new version of the string STRING, any
  221.      characters in STRING which are regexp meta-characters are quoted
  222.      with a backslash.
  223.      If the string contains no meta-characters the original string is
  224.      returned, without being copied.
  225.           (regexp-quote "foo*bar+baz")
  226.               => "foo\\*bar\\+baz"
  227.      Note that in the above example the backslashes in the returned
  228.      string are only single backslashes; the print functions print a
  229.      single backslash character as `\\' so they can be read back in.
  230.      This function is usually used when a part of a regexp being
  231.      constructed is unknown at compile time, often provided by the user.
  232.    As the section describing regexp syntax notes, the strings that
  233. parenthesised expressions match are recorded, the following two
  234. functions allow Lisp programs to access the positions of these strings.
  235.  - Function: match-start &optional EXPRESSION-INDEX
  236.      This function returns the position which the parenthesised
  237.      expression number EXPRESSION-INDEX started at in the last
  238.      successful regexp match.
  239.      If EXPRESSION-INDEX is `nil' or zero the start of the whole string
  240.      matched is returned instead.
  241.      The returned value will either be a position object if the last
  242.      match was in a buffer, or an integer if the last match was in a
  243.      string (i.e.  `regexp-match').
  244.           (regexp-match "foo(bar)" "xyzfoobarsaalsd")
  245.               => t
  246.           (match-start)
  247.               => 3
  248.           (match-start 1)
  249.               => 6
  250.  - Function: match-end &optional EXPRESSION-INDEX
  251.      Return the position which the parenthesised expression number
  252.      EXPRESSION-INDEX ended at in the last successful regexp match.
  253.      If EXPRESSION-INDEX is `nil' or zero the end of the whole match is
  254.      returned instead.
  255.      The returned value will either be a position object if the last
  256.      match was in a buffer, or an integer if the last match was in a
  257.      string (i.e.  `regexp-match').
  258.           (regexp-match "foo(bar)" "xyzfoobarsaalsd")
  259.               => t
  260.           (match-end)
  261.               => 9
  262.           (match-end 1)
  263.               => 9
  264. File: jade.info,  Node: Rectangular Editing,  Next: Controlling Undo,  Prev: Search and Match Functions,  Up: Text
  265. Rectangular Editing
  266. -------------------
  267.    These functions are used to manipulate rectangular regions of
  268. buffers. Two position objects are used to define a rectangle, these
  269. represent opposite corners of the rectangle. Note that the corner on
  270. the right hand side of the rectangle specifies the column *after* the
  271. last column included in the rectangle.
  272.  - Function: delete-rect START-POS END-POS &optional BUFFER
  273.      This function deletes a rectangle, defined by START-POS and
  274.      END-POS, from the specified buffer.
  275.  - Function: copy-rect START-POS END-POS &optional BUFFER
  276.      Returns a string containing the rectangle of text defined by the
  277.      two positions START-POS and END-POS. Any TAB characters are
  278.      expanded to SPC characters, newline characters mark the end of
  279.      each line in the rectangle.
  280.  - Function: cut-rect START-POS END-POS &optional BUFFER
  281.      A combination of the `copy-rect' and `delete-rect' functions; it
  282.      makes a copy of the rectangle's contents which is returned after
  283.      the rectangle is deleted from the buffer.
  284.  - Command: insert-rect STRING &optional POS BUFFER
  285.      Inserts the string STRING into the buffer at the specified
  286.      position, treating STRING as a rectangle of text. This means that
  287.      each successive line of STRING (separated by newline characters)
  288.      is inserted at the *same* column in successive lines.
  289.      If the end of the buffer is reached and there is still some of the
  290.      string left to insert extra lines are created at the end of the
  291.      buffer.
  292.  - Command: yank-rectangle &optional DONT-YANK-BLOCK
  293.      This function is similar to the `yank' function (*note Insertion
  294.      Functions::.), except that it uses the `insert-rect' function to
  295.      insert the piece of text.
  296. File: jade.info,  Node: Controlling Undo,  Next: Misc Text Functions,  Prev: Rectangular Editing,  Up: Text
  297. Controlling Undo
  298. ----------------
  299.    For the description of one part of controlling the undo feature, the
  300. maximum size of the undo-list, see *Note Undo::.
  301.  - Variable: buffer-record-undo
  302.      A buffer-local variable which, when set to `nil', stops any
  303.      undo-information being recorded for the buffer.
  304.      When a buffer is created, this variable is always set to `t'.
  305.  - Variable: buffer-undo-list
  306.      This buffer-local variable stores the actual list of
  307.      undo-information; each element defines one modification to the
  308.      buffer.
  309.      Don't try to be clever and access the contents of this list; the
  310.      structure may well change in future revisions of Jade.
  311.      The only thing you're allowed to do is set it to `nil', this clears
  312.      all undo-information for the buffer.
  313.  - Command: undo
  314.      Undo every change to the contents of the buffer back to the
  315.      previous command. Successive calls to this command work backwards
  316.      through the buffer's undo-list.
  317. File: jade.info,  Node: Misc Text Functions,  Prev: Controlling Undo,  Up: Text
  318. Miscellaneous Text Functions
  319. ----------------------------
  320.  - Function: empty-line-p &optional POS BUFFER
  321.      This function returns `t' if the line pointed to by POS (or by the
  322.      cursor) consists totally of TAB or SPC characters.
  323. File: jade.info,  Node: Writing Modes,  Next: Prompting,  Prev: Text,  Up: Programming Jade
  324. Writing Modes
  325. =============
  326.    Modes are used to customise individual buffers so that the text it
  327. contains can be edited in a special way. Each buffer has a single
  328. "Major mode", tailoring the buffer to the type of file contained in it
  329. (i.e. C source code uses `c-mode'). *Note Editing Modes::.
  330.    "Minor modes" provide individual features which may be enabled and
  331. disabled individually, each buffer may have any number of minor modes
  332. enabled at once. *Note Minor Modes::.
  333. * Menu:
  334. * Writing Major Modes::         How to define a new major mode
  335. * Installing Modes::            Functions and variables used to
  336.                                   install major modes in buffers
  337. * Writing Minor Modes::         Minor modes are totally different
  338.                                   to major modes
  339. * Mode-Specific Indentation::   Each major mode may define its own
  340.                                   method of indentation,
  341. * Mode-Specific Expressions::     expression handling,
  342. * Mode-Specific Comments::        and comment insertion.
  343. File: jade.info,  Node: Writing Major Modes,  Next: Installing Modes,  Up: Writing Modes
  344. Writing Major Modes
  345. -------------------
  346.    Each major mode must define a command whose name ends in `-mode'
  347. (i.e. `c-mode', `lisp-mode', etc...). This command is called when the
  348. major mode is to be installed in the current buffer. It's first action
  349. *must* be to check for an already installed mode and remove it. The
  350. following code fragment does this,
  351.      (when major-mode-kill
  352.        (funcall major-mode-kill))
  353.    *All* major modes must do this!
  354.    Now the major mode is free to install itself; generally this will
  355. entail setting the buffer-local values of the `mode-name', `major-mode',
  356. `major-mode-kill' and `keymap-path' variables. For example the
  357. `lisp-mode' sets these variables as follows,
  358.      (setq mode-name "Lisp"
  359.            major-mode 'lisp-mode
  360.            major-mode-kill 'lisp-mode-kill
  361.            keymap-path (cons 'lisp-mode-keymap keymap-path))
  362. Note how the major mode's own keymap (with all the mode's local key
  363. bindings installed in it) is consed onto the front of the
  364. `keymap-path'; this ensures that mode-local bindings take precedence
  365. over bindings in the global keymaps.
  366.    After installing itself a major mode should call a hook (generally
  367. called `X-mode-hook' where X is the name of the mode) to allow
  368. customisation of the mode itself.
  369.    The `major-mode-kill' variable holds a function to be called when the
  370. major mode is to be removed from the current buffer; basically it should
  371. remove its keymap and set all the mode-local variables to `nil'.  For
  372. example the `lisp-mode-kill' function does the following to negate the
  373. effects of the code fragment above,
  374.      (setq keymap-path (delq 'lisp-mode-keymap keymap-path)
  375.            major-mode nil
  376.            major-mode-kill nil
  377.            mode-name nil)
  378.  - Variable: major-mode
  379.      This buffer-local variable contains the symbol whose function
  380.      definition was used to install the buffer's major mode (i.e.
  381.      `c-mode', etc...).
  382.      When it is `nil' the buffer uses the `generic' mode; this is simply
  383.      the bog standard editor.
  384.  - Variable: major-mode-kill
  385.      This buffer-local variable contains the function which should be
  386.      called to remove the buffer's currently installed major-mode.
  387.      Note that the `kill-buffer' function calls this (if it's non-`nil')
  388.      just before destroying a buffer; so if necessary, an error
  389.      signalled within this function will prevent a buffer being killed.
  390.  - Variable: mode-name
  391.      A buffer-local variable containing the `pretty' name of the
  392.      buffer's major mode, a string which will be printed in the status
  393.      line.
  394.    Many modes bind commands to keys with the prefix `Ctrl-c', to save
  395. each mode creating a new root keymap the buffer-local variable
  396. `ctrl-c-keymap' exists.
  397.  - Variable: ctrl-c-keymap
  398.      This buffer-local variable can be used by major modes to hang their
  399.      keymap for the `Ctrl-c' prefix from. Simply set this variable to
  400.      the keymap your mode wants to be installed after a `Ctrl-c' prefix.
  401.    The definitions for many different types of modes can be found in
  402. Jade's lisp directory.
  403. File: jade.info,  Node: Installing Modes,  Next: Writing Minor Modes,  Prev: Writing Major Modes,  Up: Writing Modes
  404. Installing Modes
  405. ----------------
  406.    Before a major mode can be used to edit a buffer with it must be
  407. installed in that buffer. The most straightforward method of doing this
  408. is simply to invoke the mode's command which does this (i.e. `c-mode').
  409.    It could be a bit annoying to have to this every time a new buffer is
  410. created so the `mode-alist' variable allows major modes to be installed
  411. automatically, when the buffer is opened.
  412.  - Function: init-mode BUFFER &optional STRING
  413.      This function attempts to install a major mode into BUFFER. If the
  414.      `major-mode' variable is non-`nil' it defines the function to call
  415.      to install the mode; this function will be called.
  416.      Otherwise the `mode-alist' variable is searched; each regular
  417.      expression is matched against a string, when a match occurs the
  418.      associated function is called to install the mode.
  419.      The string matched against is defined by the first of the following
  420.      choices which is not `nil' or undefined.
  421.        1. The value of the optional STRING argument.
  422.        2. The word specified on the first line of the buffer bracketed
  423.           by the string `-*-'. For example if the first line contained
  424.           the string `-*-Text-*-' the string `Text' would be used.
  425.        3. The value of the variable mode-name.
  426.        4. The name of the file being edited in the buffer.
  427.      Note that each match is case-insensitive.
  428.  - Variable: mode-alist
  429.      An association list (*note Association Lists::.) defining regular
  430.      expressions which associate with a particular major mode.
  431.      When the `init-mode' function matches a regular expression to the
  432.      string it is using to find the mode for the buffer the associated
  433.      mode is installed.
  434.      For example, `mode-alist' could be,
  435.           (("\\.(c|h)$|^c(|-mode)$" . c-mode)
  436.            ("\\.jl$|^lisp(|-mode)$" . lisp-mode)
  437.            ("\\.(text|doc|txt|article|letter)$" . text-mode)
  438.            ("^(text(|-mode)|(.*/|)draft)$" . text-mode)
  439.            ("^indented-text(|-mode)$" . indented-text-mode)
  440.            ("\\.[s]$|^asm(|-mode)$" . asm-mode)
  441.            ("\\.[S]$|^asm-cpp(|-mode)$" . asm-cpp-mode)
  442.            ("\\.texi(|nfo)|^texinfo(|-mode)$" . texinfo-mode))
  443.  - Function: kill-mode &optional BUFFER
  444.      This function removes the major mode currently installed in the
  445.      specified buffer.
  446. File: jade.info,  Node: Writing Minor Modes,  Next: Mode-Specific Indentation,  Prev: Installing Modes,  Up: Writing Modes
  447. Writing Minor Modes
  448. -------------------
  449.    Minor modes are generally harder to write properly than major modes
  450. since they have to peacefully coexist with all the other minor modes
  451. which may also be enabled in a buffer.
  452.    Generally each minor mode maintains a buffer-local variable saying
  453. whether or not it's installed in the buffer. The minor mode's function
  454. usually toggles the mode on or off depending on the state of this
  455. variable.
  456.    There are two functions which *must* be used to install and remove a
  457. minor mode -- `add-minor-mode' and `remove-minor-mode', see their
  458. documentation for details.
  459.    Each buffer has a keymap containing the bindings of all the minor
  460. modes enabled in the buffer (the variable `minor-mode-keymap'). These
  461. bindings have to be added when the mode is enabled and removed when it
  462. is disabled.
  463.  - Variable: minor-mode-list
  464.      This buffer-local variable is a list of all the minor modes
  465.      enabled in a buffer.
  466.  - Variable: minor-mode-names
  467.      This buffer-local variable contains a list of strings, each string
  468.      names one of the minor modes currently enabled in the buffer.
  469.  - Variable: minor-mode-keymap
  470.      A buffer-local keymap to be used by minor-modes. This is only
  471.      created the first time a minor mode calls `add-minor-mode' in the
  472.      buffer.
  473.  - Function: add-minor-mode MODE NAME &optional NO-KEYMAP
  474.      This function installs a minor mode (the symbol MODE) into the
  475.      current buffer. All minor modes should call this before doing
  476.      anything drastic.
  477.      NAME is the string to be displayed in the status line as the name
  478.      of this minor mode.
  479.      When NO-KEYMAP is `nil' or undefined this function ensures that
  480.      the `minor-mode-keymap' variable has a valid value in this buffer.
  481.  - Function: remove-minor-mode MODE NAME
  482.      Removes a minor mode from the current buffer, the MODE and NAME
  483.      arguments must have the same value as the arguments given to
  484.      `add-minor-mode' when the mode was enabled.
  485.    The following code fragment is an example minor mode taken from
  486. Jade's source code.
  487.      (provide 'fill-mode)
  488.      
  489.      (defvar fill-column 72
  490.        "Position at which the text filling commands break lines.")
  491.      
  492.      (defvar fill-mode-p nil)
  493.      (make-variable-buffer-local 'fill-mode-p)
  494.      
  495.      ;;;###autoload
  496.      (defun fill-mode ()
  497.        "Minor mode for automatically filling lines, i.e. word-wrapping.
  498.      This makes the SPC key checks if the cursor is past the fill-column. If
  499.      so, the next line is started."
  500.        (interactive)
  501.        (if fill-mode-p
  502.            (progn
  503.              (setq fill-mode-p nil)
  504.              (remove-minor-mode 'fill-mode "Fill")
  505.              (unbind-keys minor-mode-keymap "SPC"))
  506.          (add-minor-mode 'fill-mode "Fill")
  507.          (setq fill-mode-p t)
  508.          (bind-keys minor-mode-keymap
  509.            "SPC" 'fill-mode-spc)))
  510.      
  511.      (defun fill-mode-spc ()
  512.        (interactive)
  513.        (when (> (pos-col (cursor-pos)) fill-column)
  514.          (let
  515.              ((pos (cursor-pos)))
  516.            (set-pos-col pos (1+ fill-column))
  517.            (setq pos (unless (word-start pos) (forward-word -1 pos)))
  518.            (insert "\n" pos)
  519.            (let
  520.                ((end (left-char 1 (copy-pos pos))))
  521.              (when (equal (get-char end) ?\ )
  522.                (delete-area end pos)))))
  523.        (insert " "))
  524. File: jade.info,  Node: Mode-Specific Indentation,  Next: Mode-Specific Expressions,  Prev: Writing Minor Modes,  Up: Writing Modes
  525. Mode-Specific Indentation
  526. -------------------------
  527.    Some major modes provide functions which manage the indentation of
  528. the buffer they are installed in. These modes are usually those which
  529. are designed for a particular programming language; for example C mode
  530. understands how to indent C source and Lisp mode knows about Lisp code.
  531.    To simplify matters there is a unified interface to the indentation
  532. process; each major mode simply sets the value of a buffer-local
  533. variable to the function used to indent a line in that buffer. This
  534. variable is then referenced by the functions which provide indentation.
  535.  - Variable: mode-indent-line
  536.      This buffer-local variable should contain a function when the
  537.      buffer's major mode provides special indentation.
  538.      The function should take one optional argument, the position of
  539.      the line to indent. If the value of this argument is `nil' the
  540.      current line should be indented. The function should set the
  541.      indentation of the line to the correct depth then return the glyph
  542.      position (*note Glyph Positions::.) of the first non-whitespace
  543.      character.
  544.      For example Lisp mode sets this variable to `lisp-indent-line',
  545.      this function is defined as,
  546.           (defun lisp-indent-line (&optional pos)
  547.             (set-indent-pos (lisp-indent-pos (or pos (cursor-pos)))))
  548.      Where the function `lisp-indent-pos' calculates the proper
  549.      indentation for the line pointed to by its argument.
  550.    For the functions dealing with indentation see *Note Indentation
  551. Functions::.
  552. File: jade.info,  Node: Mode-Specific Expressions,  Next: Mode-Specific Comments,  Prev: Mode-Specific Indentation,  Up: Writing Modes
  553. Mode-Specific Expressions
  554. -------------------------
  555.    Most programming use the concept of an "expression", Jade allows
  556. major modes to define two functions which define the syntax of an
  557. expression in a particular programming language. Commands exist which
  558. use these functions to allow the manipulation of expressions as
  559. entities in a buffer, much like words.
  560.  - Variable: mode-forward-exp
  561.      This buffer-local variable contains a function which calculates the
  562.      position of the end of an expression in that language.
  563.      The lambda-list of the function (i.e. its arguments) must be
  564.      `(&optional COUNT POS)'. COUNT is the number of expressions to
  565.      move forwards over (default is one), POS is the position to start
  566.      from (default is the cursor position).
  567.      The function should return the position of the character following
  568.      the end of COUNT expressions starting from POS.
  569.  - Variable: mode-backward-exp
  570.      Similar to `mode-forward-exp' but works backwards from the
  571.      character after the expression (at POS) to the start of the
  572.      previous COUNT expressions.
  573.    These functions can often be quite complex but their structure is
  574. usually the same; these two examples are taken from the Lisp mode,
  575.      (defun lisp-forward-sexp (&optional number pos)
  576.        "Return the position of the NUMBER'th next s-expression from POS."
  577.        (unless number
  578.          (setq number 1))
  579.        (while (> number 0)
  580.          ;; Move `pos' over one expression
  581.          ...
  582.          (setq number (1- number)))
  583.        pos)
  584.      
  585.      (defun lisp-backward-sexp (&optional number orig-pos)
  586.        "Return the position of the NUMBER'th previous s-expression
  587.      from ORIG-POS."
  588.        (unless number
  589.          (setq number 1))
  590.        (unless orig-pos
  591.          (setq orig-pos (cursor-pos)))
  592.        (let
  593.            ((pos (copy-pos orig-pos)))
  594.          (while (> number 0)
  595.             ;; Move `pos' backwards over one expression
  596.             ...
  597.            (setq number (1- number)))
  598.          pos))
  599. File: jade.info,  Node: Mode-Specific Comments,  Prev: Mode-Specific Expressions,  Up: Writing Modes
  600. Mode-Specific Comments
  601. ----------------------
  602.    When you wish to enter a comment in a piece of source code Jade has
  603. a command to do this (`insert-comment'); each major mode which wishes
  604. to allow comments (created by this command) must give the following
  605. variable a suitable function.
  606.  - Variable: mode-comment-fun
  607.      This buffer-local variable contains the function to call when a
  608.      comment is to be entered, basically the `insert-comment' command
  609.      just calls this function.
  610.  - Function: find-comment-pos
  611.      This function moves the cursor to a suitable position for inserting
  612.      a comment in the current line.
  613.  - Variable: comment-column
  614.      Buffer-local variable containing the canonical column number which
  615.      comments should begin at (used by the `find-comment-pos' function).
  616.      If the line extends past this column the next tab stop after the
  617.      end of the line is used instead.
  618.    The following function is an example of what is needed in the
  619. `mode-comment-fun' variable; it is used by the C mode.
  620.      (defun c-insert-comment ()
  621.        (interactive)
  622.        (find-comment-pos)
  623.        (insert "/*  */")
  624.        (goto-left-char 3))
  625. File: jade.info,  Node: Prompting,  Next: Files,  Prev: Writing Modes,  Up: Programming Jade
  626. Prompting
  627. =========
  628.    The most common way to ask the user for a response is to encode the
  629. question in the command's interactive declaration (*note Interactive
  630. Declarations::.), sometimes this is inconvenient; functions are
  631. available which have the same effect as the code letters in an
  632. interactive declaration.
  633.    The following two functions don't have an equivalent code for the
  634. interactive declaration.
  635.  - Function: y-or-n-p QUESTION
  636.      This function prompts the user for a single key response to the
  637.      string QUESTION asking a question which can be answered yes or no.
  638.      Returns `t' when QUESTION is answered with a `y' and `nil' when
  639.      `n' is typed.
  640.  - Function: yes-or-no-p QUESTION
  641.      Similar to `y-or-n-p' but the answer must be either the word `yes'
  642.      or the word `no' entered in full. This function should be used when
  643.      a mistyped answer could be catastrophic (i.e. losing changes to a
  644.      buffer).
  645.      Returns `t' for `yes', `nil' for anything else.
  646.    The following functions are the functions used by the `call-command'
  647. function to resolve interactive arguments.
  648.    Note that these function don't return the string entered (except for
  649. `prompt-for-string') -- they return some Lisp object which the string
  650. entered represents somehow.
  651.  - Function: prompt-for-file &optional PROMPT EXISTING START
  652.      Prompts for the name of a file. PROMPT is the string to display at
  653.      the head of the prompt, when EXISTING is non-`nil' only files
  654.      which actually exist are allowed to be entered. The START argument
  655.      may be a string defining the starting contents of the prompt.
  656.  - Function: prompt-for-directory &optional PROMPT EXISTING START
  657.      Prompts for the name of a directory, all arguments are similar to
  658.      in the `prompt-for-file' function.
  659.  - Function: prompt-for-buffer &optional PROMPT EXISTING DEFAULT
  660.      This function prompts for a buffer object, if EXISTING is non-`nil'
  661.      the buffer selected must exist, otherwise the buffer will be
  662.      created if it doesn't already exist. DEFAULT is the value to
  663.      return if the user enters the null string, if `nil' the current
  664.      buffer is returned.
  665.      Note that this returns the *actual buffer*, not its name as a
  666.      string.
  667.  - Function: prompt-for-symbol &optional PROMPT PREDICATE
  668.      Prompt for a symbol, PROMPT is displayed at the head of the prompt
  669.      buffer. If the PREDICATE argument is defined it is a predicate
  670.      function; only symbols which when applied to the function PREDICATE
  671.      return non-`nil' will be allowed to be entered.
  672.  - Function: prompt-for-lisp &optional PROMPT
  673.      Prompt for and return a Lisp object.
  674.  - Function: prompt-for-function &optional PROMPT
  675.      Prompts for a function.
  676.           (prompt-for-function PROMPT)
  677.           ==
  678.           (prompt-for-symbol PROMPT 'functionp)
  679.  - Function: prompt-for-variable &optional PROMPT
  680.      Prompts for a variable (a symbol whose value is not void).
  681.           (prompt-for-variable PROMPT)
  682.           ==
  683.           (prompt-for-symbol PROMPT 'boundp)
  684.  - Function: prompt-for-command &optional PROMPT
  685.      Prompts for a command (a function which may be called
  686.      interactively).
  687.           (prompt-for-command PROMPT)
  688.           ==
  689.           (prompt-for-symbol PROMPT 'commandp)
  690.  - Function: prompt-for-string &optional PROMPT
  691.      Prompt for a string, whatever string is entered is returned as-is.
  692.  - Function: prompt-for-number &optional PROMPT
  693.      Prompts for a number which is then returned.
  694.    The following function is useful when a number of options have to be
  695. chosen between, for example the menu command in Info-mode uses this
  696. function.
  697.  - Function: prompt-from-list OPTION-LIST PROMPT &optional START
  698.      Returns a selected choice from the list of options (strings)
  699.      OPTION-LIST. PROMPT is the title displayed, START the optional
  700.      starting choice.
  701. File: jade.info,  Node: Files,  Next: Processes,  Prev: Prompting,  Up: Programming Jade
  702. Files
  703. =====
  704.    Jade allows you to manipulate files in the operating system's filing
  705. system; a special type of Lisp object, a "file object", is used to
  706. represent files which have been opened for reading or writing (through
  707. the streams mechanism, *note Streams::.).
  708.    Names of files are represented by strings, the syntax of file names
  709. is defined by the underlying operating system: Jade simply treats it as
  710. a string.
  711. * Menu:
  712. * File Names::                  Files are named by a string
  713. * File Objects::                Lisp objects representing files
  714. * File Information::            Predicates on files
  715. * Manipulating Files::          Deleting, renaming and copying files
  716. * Reading Directories::         Getting a list of the files in a directory
  717. * Reading and Writing Files::   Accessing the contents of a file in one go
  718. File: jade.info,  Node: File Names,  Next: File Objects,  Up: Files
  719. File Names
  720. ----------
  721.    A "file name" is a string identifying an individual file (or
  722. directory) in the filing system (i.e. the disk). The exact syntax of
  723. file names depends on the operating system.
  724.  - Function: file-name-directory FILE-NAME
  725.      This function returns the directory part of the file name string
  726.      FILE-NAME.  This is the substring of FILE-NAME defining the
  727.      directory containing the file.
  728.           (file-name-directory "/tmp/foo")
  729.               => "/tmp/"
  730.           
  731.           (file-name-directory "foo")
  732.               => ""
  733.           
  734.           (file-name-directory "foo/bar/")
  735.               => "/foo/bar/"
  736.  - Function: file-name-nondirectory FILE-NAME
  737.      Returns the substring of the file name FILE-NAME which is *not*
  738.      the directory part.
  739.           (file-name-nondirectory "/tmp/foo")
  740.               => "foo"
  741.           
  742.           (file-name-nondirectory "foo")
  743.               => "foo"
  744.           
  745.           (file-name-nondirectory "foo/bar/")
  746.               => ""
  747.  - Function: file-name-concat &rest PARTS
  748.      This function returns a file name constructed by concatenating
  749.      each of the PARTS of the file name together. Each part is
  750.      separated by the necessary string (i.e. `/' on Unix) when
  751.      necessary. Note that each part may contain more than one component
  752.      of the file name.
  753.           (file-name-concat "/tmp" "foo" "bar")
  754.               => "/tmp/foo/bar"
  755.           
  756.           (file-name-concat "/tmp/" "foo/" "bar")
  757.               => "/tmp/foo/bar"
  758.           
  759.           (file-name-concat "/tmp/foo" "bar")
  760.               => "/tmp/foo/bar"
  761.  - Function: expand-file-name FILE-NAME &optional MAKE-ABSOLUTE
  762.      This function expands the string FILE-NAME into a valid file name.
  763.      Currently it only checks for a leading tilde character (`~') when
  764.      running on Unix, if one is found it's expanded to the user's home
  765.      directory.
  766.      When the optional argument MAKE-ABSOLUTE is non-`nil' FILE-NAME is
  767.      altered so that it is not relative to the current working
  768.      directory.  Generally this involves prefixing it by the absolute
  769.      name of the current directory.
  770.           (expand-file-name "~/src")
  771.               => "/home/jsh/src"
  772.           
  773.           (expand-file-name "foo.c" t)
  774.               => "/var/src/jade/foo.c"
  775.  - Function: tmp-file-name
  776.      This function returns the name of a file which, when created, may
  777.      be used for temporary storage. Each time this function is called a
  778.      unique name is computed.
  779.           (tmp-file-name)
  780.               => "/tmp/00088aaa"
  781.           
  782.           (tmp-file-name)
  783.               => "/tmp/00088baa"
  784. File: jade.info,  Node: File Objects,  Next: File Information,  Prev: File Names,  Up: Files
  785. File Objects
  786. ------------
  787.    A file object is a Lisp object which represents a file in the filing
  788. system. Any file object may be used as a stream (either input or output)
  789. to access the contents of the file serially, *Note Streams::.
  790. * Menu:
  791. * Creating File Objects::       Opening files
  792. * Destroying File Objects::     Closing files
  793. * File Object Predicates::      Predicates for file objects
  794. * Functions on File Objects::   Functions operating on file objects
  795. File: jade.info,  Node: Creating File Objects,  Next: Destroying File Objects,  Up: File Objects
  796. Creating File Objects
  797. .....................
  798.  - Function: open FILE-NAME MODE-STRING &optional FILE-OBJECT
  799.      This function opens the file called FILE-NAME (*note File Names::.)
  800.      and returns the file's object.
  801.      The MODE-STRING argument is a string defining the access modes used
  802.      to open the file with; this string is passed as-is to the C
  803.      library's `fopen()' function. Usually one of the following strings
  804.      is used,
  805.     `r'
  806.           Open an existing file for reading only.
  807.     `w'
  808.           Open the file for writing only, if the file exists it is
  809.           truncated to zero length. Otherwise a new file is created.
  810.     `a'
  811.           Open the file for appending to, i.e. writing to the end of
  812.           the file. If the file doesn't exist it is created.
  813.      Other options exist; consult a C library manual for details.
  814.      When the FILE-OBJECT argument is defined it should be a file
  815.      object, the file it points to will be closed and the new file will
  816.      be opened on this object.
  817. File: jade.info,  Node: Destroying File Objects,  Next: File Object Predicates,  Prev: Creating File Objects,  Up: File Objects
  818. Destroying File Objects
  819. .......................
  820.    The easiest way to close a file is simply to eliminate all
  821. references to it, subsequently the garbage collector will close it for
  822. you. It is better to close files explicitly though since only a limited
  823. number of files may be opened concurrently.
  824.  - Function: close FILE-OBJECT
  825.      This function closes the file pointed to by the file object
  826.      FILE-OBJECT.
  827.      Until a new file is opened on FILE-OBJECT any read/write accesses
  828.      to it are illegal and an error will be signalled.
  829. File: jade.info,  Node: File Object Predicates,  Next: Functions on File Objects,  Prev: Destroying File Objects,  Up: File Objects
  830. File Object Predicates
  831. ......................
  832.  - Function: filep OBJECT
  833.      This function returns `t' when its argument is a file object.
  834.  - Function: file-bound-p FILE-OBJECT
  835.      Returns `t' when the file object FILE-OBJECT is currently bound to
  836.      a physical file (i.e. the `close' function hasn't been called on
  837.      it yet).
  838.  - Function: file-eof-p FILE-OBJECT
  839.      This function returns `t' when the current position of the file
  840.      object FILE-OBJECT is the end of the file (i.e. when reading a
  841.      character from the file would return `nil').
  842. File: jade.info,  Node: Functions on File Objects,  Prev: File Object Predicates,  Up: File Objects
  843. Functions on File Objects
  844. .........................
  845.  - Function: flush-file FILE-OBJECT
  846.      This function flushes any buffered output to the file object
  847.      FILE-OBJECT to disk.
  848.      Note that when using a file which was opened with the `+' option
  849.      it's necessary to call this function when switching from reading to
  850.      writing or vice versa.
  851.  - Function: file-binding FILE-OBJECT
  852.      Returns the name of the file which the file object FILE-OBJECT is
  853.      currently bound to.
  854.  - Function: read-file-until FILE-OBJECT REGEXP &optional IGNORE-CASE
  855.      This function reads lines from the file object FILE-OBJECT until a
  856.      line matching the regular expression REGEXP is found. The matching
  857.      line is returned, or `nil' if the end of the file is reached.
  858.      When the IGNORE-CASE option is non-`nil' all regexp matching is
  859.      done case-insignificantly (except for matching ranges).
  860. File: jade.info,  Node: File Information,  Next: Manipulating Files,  Prev: File Objects,  Up: Files
  861. File Information
  862. ----------------
  863.    A number of functions exist which when given the name of a file
  864. return some information about that file.
  865.  - Function: file-exists-p FILE-NAME
  866.      Returns `t' when a file FILE-NAME exists.
  867.  - Function: file-regular-p FILE-NAME
  868.      Returns `t' when the file FILE-NAME is a `normal' file. This means
  869.      that it isn't a directory, device, symbolic link or whatever.
  870.  - Function: file-directory-p FILE-NAME
  871.      Returns `t' when the file FILE-NAME is a directory.
  872.  - Function: file-symlink-p FILE-NAME
  873.      Returns `t' when the file FILE-NAME is a symbolic link.
  874.  - Function: file-readable-p FILE-NAME
  875.      Returns `t' when the file FILE-NAME is readable.
  876.  - Function: file-writable-p FILE-NAME
  877.      Returns `t' when the file FILE-NAME is writable.
  878.  - Function: file-owner-p FILE-NAME
  879.      Returns `t' when the ownership of the file FILE-NAME is the same
  880.      as that of any files written by the editor.
  881.      Note that currently this always returns `t' in the Amiga version.
  882.  - Function: file-nlinks FILE-NAME
  883.      Returns the number of hard links pointing to the file FILE-NAME. If
  884.      FILE-NAME has only one name the number will be one.
  885.      Note that this always returns one in the Amiga version of Jade.
  886.  - Function: file-modes FILE-NAME
  887.      This function returns the access permissions of the file FILE-NAME.
  888.      This will be an integer whose format is undefined; it differs from
  889.      operating system to operating system.
  890.  - Function: set-file-modes FILE-NAME MODES
  891.      This function sets the access permissions of the file FILE-NAME to
  892.      the integer MODES (as returned by the `file-modes' function).
  893.  - Function: file-modtime FILE-NAME
  894.      Returns the system time at the last modification to the file
  895.      FILE-NAME, this will be an integer. *Note System Time::.
  896.  - Function: file-newer-than-file-p FILE-NAME1 FILE-NAME2
  897.      This function returns `t' if the file FILE-NAME1 was modified more
  898.      recently than the file FILE-NAME2 was.
  899.           (file-newer-than-file-p FILE1 FILE2)
  900.           ==
  901.           (> (file-modtime FILE1) (file-modtime FILE2))
  902. File: jade.info,  Node: Manipulating Files,  Next: Reading Directories,  Prev: File Information,  Up: Files
  903. Manipulating Files
  904. ------------------
  905.  - Command: delete-file FILE-NAME
  906.      This function deletes the file called FILE-NAME. When called
  907.      interactively FILE-NAME is prompted for.
  908.  - Command: rename-file FILE-NAME NEW-NAME
  909.      This function attempts to change the name of the file NEW-NAME to
  910.      NEW-NAME.
  911.      This won't work from one file system to another or if a file called
  912.      NEW-NAME already exists, in these cases an error is signalled.
  913.      This prompts for its arguments when called interactively.
  914.  - Command: copy-file FILE-NAME DESTINATION-NAME
  915.      Creates a new copy of the file FILE-NAME with the name
  916.      DESTINATION-NAME.
  917.      The access modes of the new file will be the same as those of the
  918.      original file.
  919.      The arguments are prompted for when this function is called
  920.      interactively.
  921. File: jade.info,  Node: Reading Directories,  Next: Reading and Writing Files,  Prev: Manipulating Files,  Up: Files
  922. Reading Directories
  923. -------------------
  924.  - Function: directory-files DIRECTORY-NAME
  925.      This function returns a list of the names of all files in the
  926.      directory whose file name is DIRECTORY-NAME. The names in the list
  927.      will be relative to the directory DIRECTORY-NAME, any directories
  928.      in the list will have a `/' character appended to them.
  929.           (directory-files "/tmp/foo"
  930.               => ("bar" "subdir/" "xyz" "." "..")
  931. File: jade.info,  Node: Reading and Writing Files,  Prev: Reading Directories,  Up: Files
  932. Reading and Writing Files
  933. -------------------------
  934.  - Function: read-file FILE-NAME
  935.      This function returns a string containing the contents of the file
  936.      called FILE-NAME.
  937.  - Function: write-file FILE-NAME CONTENTS
  938.      This function creates or overwrites the file called FILE-NAME with
  939.      the string CONTENTS as its contents.
  940. File: jade.info,  Node: Processes,  Next: Miscellaneous Functions,  Prev: Files,  Up: Programming Jade
  941. Processes
  942. =========
  943.    When running on a Unix-style operating system (i.e. the X11 version)
  944. Jade allows you to launch and control an arbitrary number of
  945. subprocesses. These subprocesses can run either synchronously or
  946. asynchronously in respect to the editor; data can be sent to the stdin
  947. channel and any output from the process is automatically written to a
  948. programmer-defined Lisp stream.
  949.    Currently there is *no* way to manipulate subprocesses in the Amiga
  950. version of Jade (sorry!).
  951. * Menu:
  952. * Process Objects::             Lisp objects associated with subprocesses
  953. * Asynchronous Processes::      Subprocesses running in parallel with Jade
  954. * Synchronous Processes::       Subprocesses which Jade runs serially
  955. * Process I/O::                 Input and output with subprocesses
  956. * Process States::              Suspending subprocesses
  957. * Signalling Processes::        Sending signals to subprocesses
  958. * Process Information::         Information stored in a process object
  959. * Interactive Processes::       Shell mode lets the user interact with a
  960.                                   subprocess
  961.